﻿using System;
using System.Text;
using System.Collections.Generic;
using OL = Microsoft.Office.Interop.Outlook;

namespace ConvergensDominoConnector
{
    public class ItemSelector
    {
        public static List<object> ValidateActiveExplorerSelection(OL.Application application)
        {
            if (application == null)
            {
                //No outlook connection
                throw new Exception("Der er ingen forbindelse til Outlook. Genstart Outlook og prøv igen.");
            }
            if (application.ActiveExplorer() == null)
            {
                //No active explorer in outlook
                throw new Exception("Intet aktivt Outlook vindue tilgængeligt. Vælg et Outlook vindue og prøv igen.");
            }

            OL.Selection activeExplorerSelection;
            try
            {
                activeExplorerSelection = application.ActiveExplorer().Selection;
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                //No selection available
                throw new Exception("Der er ikke valgt nogen mail til journalisering.\nVælg en eller flere mails og prøv igen.", ex);
            }

            if (activeExplorerSelection == null)
            {
                //No selection available
                throw new Exception("Der er ikke valgt nogen mail til journalisering.\nVælg en eller flere mails og prøv igen.");
            }

            List<object> mailItemList = new List<object>();
            try
            {
                if (activeExplorerSelection.Count > 0)
                {
                    foreach (object obj in activeExplorerSelection)
                    {
                        if (obj is OL.AppointmentItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: AppointmentItem");
                        }
                        else if (obj is OL.ContactItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: ContactItem");
                        }
                        else if (obj is OL.JournalItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: JournalItem");
                        }
                        else if (obj is OL.MailItem)
                        {
                            mailItemList.Add(obj);
                        }
                        else if (obj is OL.NoteItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: NoteItem");
                        }
                        else if (obj is OL.PostItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: PostItem");
                        }
                        else if (obj is OL.RemoteItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: RemoteItem");
                        }
                        else if (obj is OL.ReportItem)
                        {
                            mailItemList.Add(obj);
                        }
                        else if (obj is OL.TaskItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskItem");
                        }
                        else if (obj is OL.TaskRequestItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestItem");
                        }
                        else if (obj is OL.DistListItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: DistListItem");
                        }
                        else if (obj is OL.DocumentItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: DocumentItem");
                        }
                        else if (obj is OL.MeetingItem)
                        {
                            mailItemList.Add(obj);
                        }
                        else if (obj is OL.SharingItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: SharingItem");
                        }
                        else if (obj is OL.StorageItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: StorageItem");
                        }
                        else if (obj is OL.TaskRequestAcceptItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestAcceptItem");
                        }
                        else if (obj is OL.TaskRequestDeclineItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestDeclineItem");
                        }
                        else if (obj is OL.TaskRequestItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestItem");
                        }
                        else if (obj is OL.TaskRequestUpdateItem)
                        {
                            throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestUpdateItem");
                        }
                        else
                        {
                            throw new Exception("Tillykke :) \n\nDet burde ikke være muligt at få denne fejlbesked.\n" +
                            "Nu har jeg uden held forsøgt at journalisere følgende Outlook objekt typer:\n\n" +
                            "AppointmentItem\n" +
                            "ContactItem\n" +
                            "DistListItem\n" +
                            "DocumentItem\n" +
                            "JournalItem\n" +
                            "MailItem\n" +
                            "MeetingItem\n" +
                            "NoteItem\n" +
                            "PostItem\n" +
                            "RemoteItem\n" +
                            "ReportItem\n" +
                            "SharingItem\n" +
                            "StorageItem\n" +
                            "TaskItem\n" +
                            "TaskRequestAcceptItem\n" +
                            "TaskRequestDeclineItem\n" +
                            "TaskRequestItem\n" +
                            "TaskRequestUpdateItem\n" + "\n\nOutlook objekt type: Ukendt");
                        }
                    }  
                }

            }
            catch (Exception)
            {
                throw;
            }

            return mailItemList;
        }
        public static OL.Explorer GetActiveExplorer(OL.Application application)
        {
            if (application == null)
            {
                //No outlook connection
                throw new Exception("Der er ingen forbindelse til Outlook. Genstart Outlook og prøv igen.");
            }
            if (application.ActiveExplorer() == null)
            {
                //No active explorer in outlook
                throw new Exception("Intet aktivt Outlook vindue tilgængeligt. Vælg et Outlook vindue og prøv igen.");
            }

            return application.ActiveExplorer();
        }

        public static object ValidateActiveInspectorItem(OL.Application application)
        {
            if (application == null)
            {
                //No outlook connection
                throw new Exception("Der er ingen forbindelse til Outlook. Genstart Outlook og prøv igen.");
            }

            OL.Inspector activeInspector = application.ActiveInspector();
            if (activeInspector == null)
            {
                //No active explorer in outlook
                throw new Exception("Intet aktivt Outlook vindue tilgængeligt. Vælg et Outlook vindue og prøv igen.");
            }

            object obj;
            try
            {
                obj = activeInspector.CurrentItem;
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                //No selection available
                throw new Exception("Der er ikke valgt nogen mail til journalisering.\nVælg en eller flere mails og prøv igen.", ex);
            }

            if (obj == null)
            {
                //No selection available
                throw new Exception("Der er ikke valgt nogen mail til journalisering.\nVælg en eller flere mails og prøv igen.");
            }

            if (obj is OL.AppointmentItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: AppointmentItem");
            }
            else if (obj is OL.ContactItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: ContactItem");
            }
            else if (obj is OL.JournalItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: JournalItem");
            }
            else if (obj is OL.MailItem)
            {
                return obj;
            }
            else if (obj is OL.NoteItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: NoteItem");
            }
            else if (obj is OL.PostItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: PostItem");
            }
            else if (obj is OL.RemoteItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: RemoteItem");
            }
            else if (obj is OL.ReportItem)
            {
                return obj;
            }
            else if (obj is OL.TaskItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskItem");
            }
            else if (obj is OL.TaskRequestItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestItem");
            }
            else if (obj is OL.DistListItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: DistListItem");
            }
            else if (obj is OL.DocumentItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: DocumentItem");
            }
            else if (obj is OL.MeetingItem)
            {
                return obj;
            }
            else if (obj is OL.SharingItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: SharingItem");
            }
            else if (obj is OL.StorageItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: StorageItem");
            }
            else if (obj is OL.TaskRequestAcceptItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestAcceptItem");
            }
            else if (obj is OL.TaskRequestDeclineItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestDeclineItem");
            }
            else if (obj is OL.TaskRequestItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestItem");
            }
            else if (obj is OL.TaskRequestUpdateItem)
            {
                throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestUpdateItem");
            }
            else
            {
                throw new Exception("Tillykke :) \n\nDet burde ikke være muligt at få denne fejlbesked.\n" +
                "Nu har jeg uden held forsøgt at journalisere følgende Outlook objekt typer:\n\n" +
                "AppointmentItem\n" +
                "ContactItem\n" +
                "DistListItem\n" +
                "DocumentItem\n" +
                "JournalItem\n" +
                "MailItem\n" +
                "MeetingItem\n" +
                "NoteItem\n" +
                "PostItem\n" +
                "RemoteItem\n" +
                "ReportItem\n" +
                "SharingItem\n" +
                "StorageItem\n" +
                "TaskItem\n" +
                "TaskRequestAcceptItem\n" +
                "TaskRequestDeclineItem\n" +
                "TaskRequestItem\n" +
                "TaskRequestUpdateItem\n" + "\n\nOutlook objekt type: Ukendt");
            }

        }
        public static OL.Inspector GetActiveInspector(OL.Application application)
        {
            if (application == null)
            {
                //No outlook connection
                throw new Exception("Der er ingen forbindelse til Outlook. Genstart Outlook og prøv igen.");
            }
            return application.ActiveInspector();
        }
    }
}
